﻿//兼容不同版本cesium，补充官方删除更改的方法或类名 by mars3d.cn

//兼容1.73（2020-9-1）删除的方法
Redslib.BingMapsApi = { defaultKey: "" }
Redslib.MapboxApi = { defaultAccessToken: "" }

//兼容1.67（2020-3-3）删除的方法
if (!Redslib.defineProperties)
    Redslib.defineProperties = Object.defineProperties;
if (!Redslib.isArray)
    Redslib.isArray = Array.isArray;


//兼容1.62（2019-10-01）改名的方法
if (!Redslib.Matrix4.getMatrix3)
    Redslib.Matrix4.getMatrix3 = Redslib.Matrix4.getRotation;
if (!Redslib.TileMapServiceImageryProvider)
    Redslib.TileMapServiceImageryProvider = Redslib.createTileMapServiceImageryProvider;

if (!Redslib.createTileMapServiceImageryProvider) {
    Redslib.createTileMapServiceImageryProvider = function (options) {
        return new Redslib.TileMapServiceImageryProvider(options);
    }
}


//兼容1.50 （2018-10-01)版本更改了名称，造成部分3dtiles可能会出现加载不上导致渲染停止的错误。
//错误说明为：RuntimeError: Unsupported glTF Extension: KHR_technique_webgl
//原因：KHR_technique_webgl扩展新版Redslib已经不支持的缘故，需要升级一下gltf数据，使用KHR_techniques_webgl扩展即可(注意多了一个s)。
try {
    var fixGltf = function (gltf) {
        if (!gltf.extensionsUsed || !gltf.extensionsUsed.indexOf || !gltf.extensionsRequired) {
            return;
        }

        var v = gltf.extensionsUsed.indexOf('KHR_technique_webgl');
        if (v == -1) return;

        // 中招了。。
        var t = gltf.extensionsRequired.indexOf('KHR_technique_webgl');

        gltf.extensionsRequired.splice(t, 1, 'KHR_techniques_webgl');
        gltf.extensionsUsed.splice(v, 1, 'KHR_techniques_webgl');
        gltf.extensions = gltf.extensions || {};
        gltf.extensions['KHR_techniques_webgl'] = {};
        gltf.extensions['KHR_techniques_webgl'].programs = gltf.programs;
        gltf.extensions['KHR_techniques_webgl'].shaders = gltf.shaders;
        gltf.extensions['KHR_techniques_webgl'].techniques = gltf.techniques;
        var techniques = gltf.extensions['KHR_techniques_webgl'].techniques;

        gltf.materials.forEach(function (mat, index) {
            gltf.materials[index].extensions || (gltf.materials[index].extensions = { KHR_technique_webgl: {} });
            gltf.materials[index].extensions['KHR_technique_webgl'].values = gltf.materials[index].values;
            gltf.materials[index].extensions['KHR_techniques_webgl'] = gltf.materials[index].extensions['KHR_technique_webgl'];

            var myMaterialExtension = gltf.materials[index].extensions['KHR_techniques_webgl'];
            myMaterialExtension.technique || (myMaterialExtension.technique = gltf.materials[index].technique);

            for (var value in myMaterialExtension.values) {
                var us = techniques[myMaterialExtension.technique].uniforms;
                for (var key in us) {
                    if (us[key] === value) {
                        myMaterialExtension.values[key] = myMaterialExtension.values[value];
                        delete myMaterialExtension.values[value];
                        break;
                    }
                }
            };
        });

        techniques.forEach(function (t) {
            for (var attribute in t.attributes) {
                var name = t.attributes[attribute];
                t.attributes[attribute] = t.parameters[name];
            };

            for (var uniform in t.uniforms) {
                var name = t.uniforms[uniform];
                t.uniforms[uniform] = t.parameters[name];
            };
        });

    }

    Object.defineProperties(Redslib.Model.prototype, {
        _cachedGltf: {
            set: function (value) {
                this._my_cachedGltf = value;
                if (this._my_cachedGltf && this._my_cachedGltf._gltf) {
                    fixGltf(this._my_cachedGltf._gltf);
                }
            },
            get: function () {
                return this._my_cachedGltf;
            }
        }
    });
}
catch (e) {
    console.log(e)
}